home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
The World of Computer Software.iso
/
muzsrc1.zip
/
SYMCLASS.CPP
< prev
Wrap
C/C++ Source or Header
|
1992-07-21
|
16KB
|
545 lines
// **********************************************
// File: SYMCLASS.CPP
// Symbols classes library
#include "muzika.h"
#include "dialog.h"
#include "objects.h"
#include <values.h>
#include <stdio.h>
// **********************************************
// Following are the member function definitions for
// the generic SymbolClass class, from which all the symbol
// classes are derived.
// **********************************************
// SymbolClass::BitmapName returns the bitmap name
// (without the "B_" prefix) of the symbol in the resource file.
int SymbolClass :: BitmapName(LPSTR lpBuffer, int nBufferMax)
{
// Load the bitmap name from the string table in the resource file
return LoadString(hInst, symbolID, lpBuffer, nBufferMax);
}
// **********************************************
// SymbolClass::DrawSymbol draws the symbol at its place
// on the screen, derived from its ID code. The symbol is drawn
// in normal or reverse video, according to whether it is active or not.
void SymbolClass :: DrawSymbol(HDC hDC, HDC hBitmapDC, BOOL active)
{
HBITMAP hBitmap, hOldBitmap;
char name[19] = "B_";
// Test if the symbol exists at all
if (BitmapName(name+2, sizeof(name)-2)) {
// Load the symbol bitmap from the resource file
hBitmap = LoadBitmap(hInst, name);
hOldBitmap = SelectObject(hBitmapDC, hBitmap);
// Display the bitmap in normal or reverse video
if (active)
BitBlt(hDC, 2+36*(symbolID%2), 38+24*(symbolID%0x10/2), 32, 20,
hBitmapDC, 0, 0, NOTSRCCOPY);
else
BitBlt(hDC, 2+36*(symbolID%2), 38+24*(symbolID%0x10/2), 32, 20,
hBitmapDC, 0, 0, SRCCOPY);
SelectObject(hBitmapDC, hOldBitmap);
DeleteObject(hBitmap);
}
}
// **********************************************
// The NullSymbol class, derived from SymbolClass,
// is the default for the "empty slot" symbols.
// It does nothing except drawing an empty rectangle
// as its DrawSymbol function.
NullSymbol :: NullSymbol()
{
symbolID = MAXINT;
}
void NullSymbol :: DrawSymbol(HDC hDC, int ID)
{
Rectangle(hDC, 36*(ID%2), 36+24*(ID%0x10/2),
36*(ID%2+1)+1, 36+24*(ID%0x10/2+1)+1);
}
NullSymbol nullSymbol;
// **********************************************
// Following are definitions of various symbol classes,
// all derived from the generic SymbolClass.
// For each symbol class there is a constructor,
// putting values in the symbolID and symbolType variables,
// and a CreateObject function, which returns a pointer
// to a newly created MusicalObject corresponding to the symbol.
// Any future extensions of symbols should be added here.
class FullNoteSymbol : virtual public SymbolClass {
public:
FullNoteSymbol() {symbolID = 16; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int Y);
} FullNoteSymbol;
MusicalObject *FullNoteSymbol :: CreateObject(int, int X, int Y)
{
return new Note(X, Y, FULLDURATION);
}
class FullPauseSymbol : virtual public SymbolClass {
public:
FullPauseSymbol() {symbolID = 17; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} FullPauseSymbol;
MusicalObject *FullPauseSymbol :: CreateObject(int, int X, int)
{
return new Pause(X, FULLDURATION);
}
class HalfNoteSymbol : virtual public SymbolClass {
public:
HalfNoteSymbol() {symbolID = 18; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int Y);
} HalfNoteSymbol;
MusicalObject *HalfNoteSymbol :: CreateObject(int, int X, int Y)
{
return new Note(X, Y, HALFDURATION);
}
class HalfPauseSymbol : virtual public SymbolClass {
public:
HalfPauseSymbol() {symbolID = 19; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} HalfPauseSymbol;
MusicalObject *HalfPauseSymbol :: CreateObject(int, int X, int)
{
return new Pause(X, HALFDURATION);
}
class QuarterNoteSymbol : virtual public SymbolClass {
public:
QuarterNoteSymbol() {symbolID = 20; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int Y);
} QuarterNoteSymbol;
MusicalObject *QuarterNoteSymbol :: CreateObject(int, int X, int Y)
{
return new Note(X, Y, QUARTERDURATION);
}
class QuarterPauseSymbol : virtual public SymbolClass {
public:
QuarterPauseSymbol() {symbolID = 21; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} QuarterPauseSymbol;
MusicalObject *QuarterPauseSymbol :: CreateObject(int, int X, int)
{
return new Pause(X, QUARTERDURATION);
}
class EighthNoteSymbol : virtual public SymbolClass {
public:
EighthNoteSymbol() {symbolID = 22; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int Y);
} EighthNoteSymbol;
MusicalObject *EighthNoteSymbol :: CreateObject(int, int X, int Y)
{
return new Note(X, Y, EIGHTHDURATION);
}
class EighthPauseSymbol : virtual public SymbolClass {
public:
EighthPauseSymbol() {symbolID = 23; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} EighthPauseSymbol;
MusicalObject *EighthPauseSymbol :: CreateObject(int, int X, int)
{
return new Pause(X, EIGHTHDURATION);
}
class SixteenthNoteSymbol : virtual public SymbolClass {
public:
SixteenthNoteSymbol() {symbolID = 24; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int Y);
} SixteenthNoteSymbol;
MusicalObject *SixteenthNoteSymbol :: CreateObject(int, int X, int Y)
{
return new Note(X, Y, SIXTEENTHDURATION);
}
class SixteenthPauseSymbol : virtual public SymbolClass {
public:
SixteenthPauseSymbol() {symbolID = 25; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} SixteenthPauseSymbol;
MusicalObject *SixteenthPauseSymbol :: CreateObject(int, int X, int)
{
return new Pause(X, SIXTEENTHDURATION);
}
class KeySolSymbol : virtual public SymbolClass {
public:
KeySolSymbol() {symbolID = 32; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} KeySolSymbol;
MusicalObject *KeySolSymbol :: CreateObject(int, int X, int)
{
return new Key(X, KEYSOL);
}
class KeyFaSymbol : virtual public SymbolClass {
public:
KeyFaSymbol() {symbolID = 33; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} KeyFaSymbol;
MusicalObject *KeyFaSymbol :: CreateObject(int, int X, int)
{
return new Key(X, KEYFA);
}
class BeatCSymbol : virtual public SymbolClass {
public:
BeatCSymbol() {symbolID = 48; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} BeatCSymbol;
MusicalObject *BeatCSymbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEATC);
}
class BeatCBarSymbol : virtual public SymbolClass {
public:
BeatCBarSymbol() {symbolID = 49; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} BeatCBarSymbol;
MusicalObject *BeatCBarSymbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEATCBAR);
}
class Beat28Symbol : virtual public SymbolClass {
public:
Beat28Symbol() {symbolID = 50; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat28Symbol;
MusicalObject *Beat28Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT28);
}
class Beat24Symbol : virtual public SymbolClass {
public:
Beat24Symbol() {symbolID = 51; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat24Symbol;
MusicalObject *Beat24Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT24);
}
class Beat38Symbol : virtual public SymbolClass {
public:
Beat38Symbol() {symbolID = 52; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat38Symbol;
MusicalObject *Beat38Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT38);
}
class Beat34Symbol : virtual public SymbolClass {
public:
Beat34Symbol() {symbolID = 53; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat34Symbol;
MusicalObject *Beat34Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT34);
}
class Beat48Symbol : virtual public SymbolClass {
public:
Beat48Symbol() {symbolID = 54; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat48Symbol;
MusicalObject *Beat48Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT48);
}
class Beat44Symbol : virtual public SymbolClass {
public:
Beat44Symbol() {symbolID = 55; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat44Symbol;
MusicalObject *Beat44Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT44);
}
class Beat68Symbol : virtual public SymbolClass {
public:
Beat68Symbol() {symbolID = 56; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} Beat68Symbol;
MusicalObject *Beat68Symbol :: CreateObject(int, int X, int)
{
return new Beat(X, BEAT68);
}
class BarSymbol : virtual public SymbolClass {
public:
BarSymbol() {symbolID = 64; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} BarSymbol;
MusicalObject *BarSymbol :: CreateObject(int, int X, int)
{
return new Bar(X, BAR);
}
class DoubleBarSymbol : virtual public SymbolClass {
public:
DoubleBarSymbol() {symbolID = 65; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} DoubleBarSymbol;
MusicalObject *DoubleBarSymbol :: CreateObject(int, int X, int)
{
return new Bar(X, DOUBLEBAR);
}
class StartBarSymbol : virtual public SymbolClass {
public:
StartBarSymbol() {symbolID = 66; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} StartBarSymbol;
MusicalObject *StartBarSymbol :: CreateObject(int, int X, int)
{
return new Bar(X, STARTBAR);
}
class EndBarSymbol : virtual public SymbolClass {
public:
EndBarSymbol() {symbolID = 67; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int X, int);
} EndBarSymbol;
MusicalObject *EndBarSymbol :: CreateObject(int, int X, int)
{
return new Bar(X, ENDBAR);
}
class ForteSymbol : virtual public SymbolClass {
public:
ForteSymbol() {symbolID = 80; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} ForteSymbol;
MusicalObject *ForteSymbol :: CreateObject(int, int X, int)
{
return new Loudness(X, FORTE);
}
class FortissimoSymbol : virtual public SymbolClass {
public:
FortissimoSymbol() {symbolID = 81; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} FortissimoSymbol;
MusicalObject *FortissimoSymbol :: CreateObject(int, int X, int)
{
return new Loudness(X, FORTISSIMO);
}
class PianoSymbol : virtual public SymbolClass {
public:
PianoSymbol() {symbolID = 82; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} PianoSymbol;
MusicalObject *PianoSymbol :: CreateObject(int, int X, int)
{
return new Loudness(X, PIANO);
}
class PianissimoSymbol : virtual public SymbolClass {
public:
PianissimoSymbol() {symbolID = 83; symbolType = POINTOBJECT;}
virtual MusicalObject *CreateObject(int, int X, int);
} PianissimoSymbol;
MusicalObject *PianissimoSymbol :: CreateObject(int, int X, int)
{
return new Loudness(X, PIANISSIMO);
}
class CrescendoSymbol : virtual public SymbolClass {
public:
CrescendoSymbol() {symbolID = 84; symbolType = CONTINUOUSOBJECT;}
MusicalObject *CreateObject(int, int Xleft, int Xright);
} CrescendoSymbol;
MusicalObject *CrescendoSymbol :: CreateObject(int, int Xleft, int Xright)
{
return new Crescendo(Xleft, Xright, CRESCENDO);
}
class DiminuendoSymbol : virtual public SymbolClass {
public:
DiminuendoSymbol() {symbolID = 85; symbolType = CONTINUOUSOBJECT;}
MusicalObject *CreateObject(int, int Xleft, int Xright);
} DiminuendoSymbol;
MusicalObject *DiminuendoSymbol :: CreateObject(int, int Xleft, int Xright)
{
return new Crescendo(Xleft, Xright, DIMINUENDO);
}
class TextSymbol : virtual public SymbolClass {
public:
TextSymbol() {symbolID = 96; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int staff, int X, int Y);
} TextSymbol;
char _text[MAXTEXT+1];
// **********************************************
// DialogText is the function of the dialog box
// that appears when a Text object is inserted.
BOOL FAR PASCAL _export DialogText(HWND hDlg, unsigned message, WORD wParam, LONG)
{
switch (message) {
case WM_INITDIALOG:
SendDlgItemMessage(hDlg, ID_TEXT, EM_LIMITTEXT, MAXTEXT, 0);
return TRUE;
case WM_COMMAND:
if (wParam == IDOK) {
GetDlgItemText(hDlg, ID_TEXT, _text, MAXTEXT);
EndDialog(hDlg, 0);
}
return TRUE;
}
return FALSE;
}
MusicalObject *TextSymbol :: CreateObject(int, int X, int Y)
{
FARPROC lpDialog = MakeProcInstance((FARPROC) DialogText, hInst);
DialogBox(hInst, "D_TEXT", hMainWnd, lpDialog);
FreeProcInstance(lpDialog);
return new Text(X, Y, _text);
}
// **********************************************
// The block operation symbols are in no way different
// from any other symbols; their constructors and
// CreateObject functions are similar to those of any
// of the symbols above. However, the CreateObject function
// in these symbols returns a NULL value, indicating
// that no object has been created as a result of the operation.
class MarkBlockSymbol : virtual public SymbolClass {
public:
MarkBlockSymbol() {symbolID = 112; symbolType = CONTINUOUSOBJECT;}
MusicalObject *CreateObject(int staff, int Xleft, int Xright);
} MarkBlockSymbol;
MusicalObject *MarkBlockSymbol :: CreateObject(int staff, int Xleft, int Xright)
{
MarkBlock(staff, Xleft, staff, Xright);
return NULL;
}
class CutBlockSymbol : virtual public SymbolClass {
public:
CutBlockSymbol() {symbolID = 113; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int, int);
} CutBlockSymbol;
MusicalObject *CutBlockSymbol :: CreateObject(int, int, int)
{
CutBlock();
return NULL;
}
class CopyBlockSymbol : virtual public SymbolClass {
public:
CopyBlockSymbol() {symbolID = 114; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int, int, int);
} CopyBlockSymbol;
MusicalObject *CopyBlockSymbol :: CreateObject(int, int, int)
{
CopyBlock();
return NULL;
}
class PasteBlockSymbol : virtual public SymbolClass {
public:
PasteBlockSymbol() {symbolID = 115; symbolType = POINTOBJECT;}
MusicalObject *CreateObject(int staff, int X, int);
} PasteBlockSymbol;
MusicalObject *PasteBlockSymbol :: CreateObject(int staff, int X, int)
{
Part &p = *((Part *) &melody.part[displayedPart]);
PasteBlock(staff/p.multiplicity()*p.multiplicity(), X);
return NULL;
}
// **********************************************
// The symbolArray is a global array of symbol classes
// in which a symbol with a given ID is searched.
// The list is sorted in the order of increasing ID,
// and ends with a NullSymbol (with the ID of MAXINT).
SymbolClass *symbolArray[] = {
&FullNoteSymbol, &FullPauseSymbol,
&HalfNoteSymbol, &HalfPauseSymbol,
&QuarterNoteSymbol, &QuarterPauseSymbol,
&EighthNoteSymbol, &EighthPauseSymbol,
&SixteenthNoteSymbol, &SixteenthPauseSymbol,
&KeySolSymbol, &KeyFaSymbol,
&BeatCSymbol, &BeatCBarSymbol,
&Beat28Symbol, &Beat24Symbol,
&Beat38Symbol, &Beat34Symbol,
&Beat48Symbol, &Beat44Symbol,
&Beat68Symbol,
&BarSymbol, &DoubleBarSymbol,
&StartBarSymbol, &EndBarSymbol,
&ForteSymbol, &FortissimoSymbol,
&PianoSymbol, &PianissimoSymbol,
&CrescendoSymbol, &DiminuendoSymbol,
&TextSymbol,
&MarkBlockSymbol, &CutBlockSymbol,
&CopyBlockSymbol, &PasteBlockSymbol,
&nullSymbol};